package org.pms.web.jsf.controller;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;

import org.apache.log4j.Logger;
import org.pms.core.entity.Person;
import org.pms.core.exception.ServiceException;
import org.pms.core.service.PersonService;
import org.pms.core.service.PersonServiceImpl;
import org.pms.web.jsf.util.JsfUtil;

/**
 * Controller que trabalha com a lista de pessoas
 * 
 * Ações definidas: 
 *   * getPersonList : Obtem lista de pessoas 
 *   * delete        : Remover pessoa 
 *   * activeChange  : ativa ou inativa a pessoa
 * 
 * @author Paulo
 * 
 */
@ManagedBean
public class PersonController {
	private static Logger logger = Logger.getLogger(PersonController.class);
	private static final String GENERIC_ERROR = "Ocorreu um erro genérico!";
	
	private List<Person> personList = null;
	private PersonService personService;

	/**
	 * Instancia ou inicializa dependência do controller
	 */
	public PersonController() {
		personService = new PersonServiceImpl();
	}

	/**
	 * Resetar informações do controller
	 */
	private void reset() {
		personList = null;
	}

	/**
	 * Obter lista de pessoa
	 * 
	 * @return
	 */
	public List<Person> getPersonList() {
		if (personList == null) {
			try {
				personList = personService.findAllPerson();
			} catch (ServiceException se) {
				JsfUtil.addErrorMessage(se.getMessage());
			} catch (Exception e) {				
				JsfUtil.addErrorMessage(GENERIC_ERROR);
				logger.error(GENERIC_ERROR,e);
			}
		}
		return personList;
	}

	/**
	 * Remover pessoa
	 * 
	 * @return próxima ação jsf
	 */
	public String delete() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			
			Person person = context.getApplication().evaluateExpressionGet(context,
					"#{item}", Person.class);
	
			// remover pessoa
			personService.delete(person);
			reset();
		} catch (ServiceException se) {
			JsfUtil.addErrorMessage(se.getMessage());
		} catch (Exception e) {
			logger.error(GENERIC_ERROR,e);
			JsfUtil.addErrorMessage(GENERIC_ERROR);
		}
			

		return "person_list";
	}

	/**
	 * Ativar/Inativar pessoa
	 * 
	 * @return Boolean true em caso de sucesso
	 */
	public Boolean activeChange() {
		FacesContext context = FacesContext.getCurrentInstance();
		
		try {
			// obter pessoa do item clicado
			Person person = context.getApplication().evaluateExpressionGet(context,
					"#{item}", Person.class);
			// inverter o booleano do campo active
			person.toggleActive();
			// salvar informação no banco
			personService.savePerson(person);
			reset();
		} catch (ServiceException se) {
			JsfUtil.addErrorMessage(se.getMessage());
			return false;
		} catch (Exception e) {
			logger.error(GENERIC_ERROR,e);
			JsfUtil.addErrorMessage(GENERIC_ERROR);
			return false;
		}

		return true;
	}

}
